﻿<!DOCTYPE html>
<html class="theme theme-white">
<head>
<meta charset="utf-8">
<title>redis学习---数据过期及内存回收策略</title>
<link href="https://www.zybuluo.com/static/assets/template-theme-white.css" rel="stylesheet" media="screen">
<style type="text/css">

#wmd-preview h1  {
    color: #0077bb; /* 将标题改为蓝色 */
}</style>
</head>
<body class="theme theme-white">
<div id="wmd-preview" class="wmd-preview wmd-preview-full-reader"><div class="md-section-divider"></div><div class="md-section-divider"></div><h1 data-anchor-id="86wy" id="redis学习-数据过期及内存回收策略">redis学习---数据过期及内存回收策略</h1><div class="md-section-divider"></div><h2 data-anchor-id="6ayd" id="目录">目录</h2><ul data-anchor-id="tdkz">
<li>设置时间过期的方式</li>
<li>过期时间清理策略</li>
<li>内存回收策略</li>
</ul><div class="md-section-divider"></div><h2 data-anchor-id="nozv" id="1-设置时间过期的方式">1. 设置时间过期的方式</h2><table data-anchor-id="rxag" class="table table-striped-white table-bordered">
<thead>
<tr>
 <th>命令</th>
 <th>说明</th>
</tr>
</thead>
<tbody><tr>
 <td>SET key value [EX seconds] [PX milliseconds]</td>
 <td>EX代表过期时间单位为秒 PX代表过期时间单位为毫秒</td>
</tr>
<tr>
 <td>EXPIRE key seconds</td>
 <td>为给定 key 设置生存时间单位为秒</td>
</tr>
<tr>
 <td>PEXPIRE key milliseconds</td>
 <td>为给定 key 设置生存时间单位为毫秒</td>
</tr>
<tr>
 <td>PERSIST key</td>
 <td>移除给定 key 的生存时间</td>
</tr>
<tr>
 <td>TTL/PTTL key</td>
 <td>返回给定 key 的剩余生存时间</td>
</tr>
</tbody></table><div class="md-section-divider"></div><h2 data-anchor-id="lbyp" id="2-过期时间清理策略">2. 过期时间清理策略</h2><div class="md-section-divider"></div><h3 data-anchor-id="0ri0" id="21-定时删除">2.1 定时删除</h3><p data-anchor-id="yu3f"><strong>简介：</strong> 在设置键的过期时间的同时，创建一个定时器（timer），让定时器在键的过期时间来临时，立即执行对键的删除操作 <br>
<strong>优点：</strong> 内存友好 <br>
<strong>缺点：</strong> CPU不友好</p><div class="md-section-divider"></div><h3 data-anchor-id="ittc" id="22-惰性删除">2.2 惰性删除</h3><p data-anchor-id="jri1"><strong>简介：</strong> 放任键过期时间不管，但每次从键空间中获取键时，都检查取得的键是否过期，如果过期就删除，没有过期就返回该键 <br>
<strong>优点：</strong> 对cpu友好 <br>
<strong>缺点：</strong> 对内存不友好</p><div class="md-section-divider"></div><h3 data-anchor-id="vhti" id="23-定期删除">2.3 定期删除</h3><p data-anchor-id="0md8"><strong>简介：</strong> 是定时删除+惰性删除的一个结合。每隔一段时间，程序就对数据库进行一次检查，删除里面的过期键，至于要删除多少过期键，以及要检查多少个数据库，由算法决定。 <br>
<strong>优点：</strong> 对cpu和内存都比较友好 <br>
<strong>缺点：</strong> 难点是确定操作执行的时长和频率</p><div class="md-section-divider"></div><h3 data-anchor-id="l4xn" id="24-配置">2.4 配置</h3><div class="md-section-divider"></div><pre class="prettyprint linenums prettyprinted" data-anchor-id="m7ng"><ol class="linenums"><li class="L0"><code class="language-properties"><span class="pln">hz </span><span class="lit">10</span></code></li></ol></pre><div class="md-section-divider"></div><h3 data-anchor-id="h4tv" id="25-算法规则">2.5 算法规则</h3><ol data-anchor-id="75c3">
<li>Redis配置项hz定义了serverCron任务的执行周期，默认为10，即CPU空闲时每秒执行10次;</li>
<li>每次过期key清理的时间不超过CPU时间的25%，即若hz=1，则一次清理时间最大为250ms，若hz=10，则一次清理时间最大为25ms;</li>
<li>清理时依次遍历所有的db;</li>
<li>从db中随机取20个key，判断是否过期，若过期，则逐出;</li>
<li>若有5个以上key过期，则重复步骤4，否则遍历下一个db;</li>
<li>在清理过程中，若达到了25%CPU时间，退出清理过程;</li>
</ol><p data-anchor-id="tc7l">由于算法采用的随机取key判断是否过期的方式，故几乎不可能清理完所有的过期Key;目的只是将要过期的key的百分比降到了25%以下 <br>
调高hz参数可以提升清理的频率，过期key可以更及时的被删除，但hz太高会增加CPU时间的消耗</p><div class="md-section-divider"></div><h2 data-anchor-id="zghb" id="3-内存回收策略">3. 内存回收策略</h2><div class="md-section-divider"></div><h3 data-anchor-id="m2ax" id="31-简介">3.1 简介：</h3><p data-anchor-id="wp6h">主要用于 当redis用于缓存的内存不足时，如何处理写入和申请内存空间。和以上的过期时间清理策略不同</p><div class="md-section-divider"></div><h3 data-anchor-id="wwpj" id="32-配置">3.2 配置</h3><div class="md-section-divider"></div><pre class="prettyprint linenums prettyprinted" data-anchor-id="t8tu"><ol class="linenums"><li class="L0"><code class="language-properties"><span class="pln">maxmemory </span><span class="str">&lt;bytes&gt;</span><span class="pln">  </span><span class="com">#最大内存 单位字节</span></code></li><li class="L1"><code class="language-properties"><span class="pln">maxmemory</span><span class="pun">-</span><span class="pln">policy noeviction   </span><span class="com">#默认</span></code></li></ol></pre><div class="md-section-divider"></div><h3 data-anchor-id="z87z" id="33-具体策略列表">3.3 具体策略列表</h3><table data-anchor-id="j8g2" class="table table-striped-white table-bordered">
<thead>
<tr>
 <th>策略</th>
 <th>说明</th>
</tr>
</thead>
<tbody><tr>
 <td>noeviction</td>
 <td>不做任何处理，只在写入时 ，提示错误</td>
</tr>
<tr>
 <td>volatile-ttl</td>
 <td>删除最近到期的key</td>
</tr>
<tr>
 <td>allkeys-random</td>
 <td>随机删除任意key</td>
</tr>
<tr>
 <td>volatile-random</td>
 <td>删除具有过期时间的随机秘钥</td>
</tr>
<tr>
 <td>allkeys-lfu</td>
 <td>移除最近最少使用的key</td>
</tr>
<tr>
 <td>volatile-lfu</td>
 <td>在设置了过期时间的键空间中，移除最近最少使用的key</td>
</tr>
<tr>
 <td>allkeys-lru</td>
 <td>移除最少使用的key</td>
</tr>
<tr>
 <td>volatile-lru</td>
 <td>在设置了过期时间的键空间中，移除最少使用的key</td>
</tr>
</tbody></table><hr></div>
</body>
</html>